package com.young.quartz.scheduler;


import com.young.quartz.domain.entity.QuartzLogEntity;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public interface BaseJob extends Job{
    /**
     * 反射添加定时任务需要实现的方法
     *
     * 需要执行的方法,必须实现失败时异常参数的保存
     * 异常时保存QuartzLogEntity日志类：
     * QuartzLogEntity(String functionName：类的全路径ps:io.antpay.quartz.xxxxjob, String functionInfo:类的描述：XXX类作用,
     * Integer state :0为成功，1为失败 2已重试, String params：保存需要的参数, String errorCause：保存错误原因, String mark：备注)
     * 添加抛出原异常
     * ps：
     * 成功  quartzLogRepository.save(new QuartzLogEntity(this.getClass().getName(),"通联支付对账数据", 0, params, "", ""));
     * 失败  quartzLogRepository.save(new QuartzLogEntity(this.getClass().getName(),"通联支付对账数据", 1, params, "Error:数据保存失败", ""));
     * @param context
     * @throws JobExecutionException
     */
    void execute(JobExecutionContext context) throws JobExecutionException;

    /**
     * 定时任务失败时，反射执行的方法
     *
     * 失败时，重试执行的方法，必须实现对执行时保存的参数解析。根据解析的参数重新调用该方法
     * 参数封装再日志类的params内
     * 执行成功或者执行失败，修改QuartzLogEntity类状态码为2
     * 对执行的信息替换至functionInfo
     * 其他保持不变
     * ps：
     *  成功：
     *   quartzLogEntity.setState(2);
     *   quartzLogEntity.setFunctionInfo("重试成功");
     *   quartzLogRepository.saveAndFlush(quartzLogEntity);
     *  失败：
     *   quartzLogEntity.setFunctionInfo("重试失败,"+e.getMessage());
     *   quartzLogRepository.saveAndFlush(quartzLogEntity);
     * @param quartzLogEntity
     */
    public void execute(QuartzLogEntity quartzLogEntity);
}
